package com.itany.corejava.code07_面向对象.继承;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月03日 13:35
 */
public class Pet2 {
    String name;
    int age;

    public Pet2() {

    }

    public Pet2(String name) {
        this.name = name;
    }

    public Pet2(int age) {
        this.age = age;
    }
    public void print(){
        System.out.println("父类中的print方法");
    }

}

class Dog2 extends Pet2 {
    private String gender;
    String name="alice";

    public Dog2(String name, String gender) {
        super(name);//位于第一行，在该方法中只能调用一次，指的是引用父类构造方法，子类对应的构造方法与父类对应的构造方法需要能匹配上(子类方法的参数必须包含父类构造方法的所有参数)

        this.gender = gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getGender() {
        return gender;
    }

    public void show() {
        // 此时父类与子类均存在name属性
        System.out.println("子类name:" + name);
        System.out.println("父类name:" + super.name);
        System.out.println("子类name:" + this.name);

        // 当父类与子类遇到同名属性和同名方法的时候，
        // 如果访问子类，通过this.属性名或者this.方法名来调用
        // 如果访问父类，通过super.属性名或者super.方法名来调用
        super.print();
        print();
        this.print();

    }
    public void print(){
        System.out.println("子类里的print方法");
    }

}

/*结论:
        创建子类对象时, 默认会自动调用父类的构造方法
        super 关键字
            表示父类对象的引用, 只能出现在子类中
            1.可以使用super(构造方法参数) 调用父类的构造方法,同一个构造方法中只能调用一次, 且必须处于第一行
            2.可以使用super.属性 访问父类中的属性, 访问的属性必须在继承范围内
               当子类没有与父类同名的属性时, 可以省略super 关键字
            3.可以使用super.方法名(参数) 访问父类中的方法
                当子类中没有与父类同名的方法时, 可以省略super 关键字
            4.当子类与父类存在同名的属性或者方法时
                通过this 表示访问子类自己的
                通过super 表示访问父类的






  */
class TestDog2 {
    public static void main(String[] args) {
        Dog2 dog2 = new Dog2("花花", "公");
        dog2.show();

    }
}